package innerclass;

/**
 * 实例内部类
 *
 */

class Outer{
    public int data1=1;
    private int data2=2;
    public static int data3=3;

    class Inner{
        public int data1=1111;
        public int data4=4;
        private int data5=5;
        //public static int data6;
        //实例化内部类不能有静态变量
        //类加载的时候不会加载普通成员
        //类中的静态变量随着类的加载而加载，不依赖外部对象，而这里依赖于Inner这类的对象

        public static final int data6 = 6;  //不允许定义静态变量，但可以定义常量
         public void test() {
             System.out.println(data1);  //输出1111，优先找内部类的data1
             System.out.println(Outer.this.data1);  //输出1
             System.out.println(data4);
             System.out.println(data5);
             System.out.println("实例内部类");
        }
    }

    public void test() {
        System.out.println(data1);
        System.out.println(data2);
        System.out.println(new Inner().data4);
        System.out.println("外部类");
    }
}

public class Test2 {
    public static void main(String[] args) {
        Outer outerClass = new Outer();
        outerClass.test();
        //获取实例内部类对象，依赖于外部类对象
        Outer.Inner innerClass1 = outerClass.new Inner();
        innerClass1.test();


        Outer.Inner innerClass2 = new Outer().new Inner();
        innerClass2.test();
    }
}
